# -*- coding: utf-8 -*-
# @Time    : 2024/7/1 15:52
# @Author  : yujiahao
# @File    : 13_numpy_matlib.py
# @description:NumPy Matrix矩阵库

'''
NumPy 提供了一个 矩阵库模块numpy.matlib，该模块中的函数返回的是一个 matrix 对象，而非 ndarray 对象。
矩阵由 m 行 n 列（m*n）元素排列而成，矩阵中的元素可以是数字、符号或数学公式等。
'''
import numpy.matlib
import numpy as np


def main():
    # todo 1、 matlib.empty()

    '''
    matlib.empty() 返回一个空矩阵，所以它的创建速度非常快。
    语法：numpy.matlib.empty(shape, dtype, order)

    该函数的参数说明如下：
        shape：以元组的形式指定矩阵的形状。
        dtype：表示矩阵的数据类型。
        order：有两种选择，C（行序优先） 或者 F（列序优先）。
    '''

    # 矩阵中会填充无意义的随机值
    print(np.matlib.empty((2, 2)))

    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')

    # todo 2、numpy.matlib.zeros()
    '''numpy.matlib.zeros() 创建一个以 0 填充的矩阵'''
    print(np.matlib.zeros((2, 2)))

    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')

    # todo 3、numpy.matlib.ones()
    '''numpy.matlib.ones() 创建一个以 1 填充的矩阵。'''
    print(np.matlib.ones((2, 2)))

    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')

    # todo 4、numpy.matlib.eye()
    '''
    numpy.matlib.eye() 返回一个对角线元素为 1，而其他元素为 0 的矩阵 。
    numpy.matlib.eye(n,M,k, dtype)

    函数参数
        n: 返回矩阵的行数。
        M: 返回矩阵的列数，默认为 n，即默认生成一个方阵。
        k: 对角线的索引。k=0 表示主对角线，k>0 表示上偏移的对角线，k<0 表示下偏移的对角线。
        dtype: 矩阵中元素的数据类型。
    '''
    print(np.matlib.eye(n=3, M=4, k=0, dtype=float))

    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')

    # todo 5、numpy.matlib.identity()
    '''该函数返回一个给定大小的单位矩阵，矩阵的对角线元素为 1，而其他元素均为 0。
    
    区别总结
        1、矩阵形状:
        
            numpy.matlib.eye() 可以生成非方阵（行数和列数可以不同）。
            numpy.matlib.identity() 只能生成方阵（行数和列数相同）。
        2、对角线偏移:
        
            numpy.matlib.eye() 可以指定对角线的偏移量（通过参数 k）。
            numpy.matlib.identity() 只生成主对角线为 1 的方阵，没有偏移量参数。
        3、参数数量:
        
            numpy.matlib.eye() 需要指定行数 n，可以选择性地指定列数 M 和对角线偏移量 k。
            numpy.matlib.identity() 只需要指定方阵的大小 n。
    适用场景
        如果需要生成非方阵或者需要指定对角线偏移量，使用 numpy.matlib.eye()。
        如果只需要生成一个简单的方阵，使用 numpy.matlib.identity()。
    
    '''
    print(np.matlib.identity(5, dtype=float))

    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')

    #  todo 6、numpy.matlib.rand()
    '''numpy.matlib.rand() 创建一个以随机数填充，并给定维度的矩阵。'''
    print(np.matlib.rand(3, 3))
    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')

    # matrix 只能表示二维数据，而 ndarray 也可以是二维数组，
    # matrix 专门设计用于矩阵运算，并且具有一些特殊的特性和方法，使得线性代数运算更加方便。
    # 创建矩阵i
    i = np.matrix('1,2;3,4')
    print(i)
    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')

    # 实现 matrix 与 ndarray 之间的转换，如下所示：
    j = np.asarray(i)
    print(j)
    print('''\n-----------------------------------☆☆☆分割线☆☆☆----------------------------------------\n''')

    k = np.asmatrix(j)
    print(k)


if __name__ == '__main__':
    main()
